// UART模块顶层设计：包含AXI总线接口的UART控制器
module Uart(
    // 系统基础信号
    input logic sys_clk,       // 系统时钟（通常50MHz）
    input logic rst,           // 同步复位信号（高有效）
    
    // UART-TX发送端接口
    input logic uart_tx_en,            // 发送使能信号（上升沿触发）
    input logic [7:0] uart_tx_data [0:31], // 最大32字节的发送缓存
    output wire uart_tx,              // 物理发送信号线
    output logic uart_tx_busy,         // 发送忙标志（高有效）

    // UART-RX接收端接口（未使用，进行安全处理）
    input logic uart_rx_en,            // 接收使能（固定禁用）
    input logic uart_rx,              // 物理接收信号线（接固定值）
    output logic uart_rx_done,         // 接收完成标志（保留）
    output logic [7:0] uart_rx_data    // 接收数据缓存（保留）
);

// ==================================================
// AXI-Lite总线信号声明（添加未使用信号处理）
// ==================================================
logic  [3:0]  s_axi_awaddr;    // 写地址
logic         s_axi_awvalid;
logic        s_axi_awready;
logic  [31:0] s_axi_wdata;
logic  [3:0]  s_axi_wstrb;
logic         s_axi_wvalid;
logic        s_axi_wready;
logic [1:0]  s_axi_bresp;
logic        s_axi_bvalid;
logic         s_axi_bready;

// 添加读通道信号处理（防止悬空）
logic  [3:0]  s_axi_araddr = 4'h0;
logic         s_axi_arvalid = 1'b0;
logic        s_axi_arready;
logic  [31:0] s_axi_rdata;
logic  [1:0]  s_axi_rresp;
logic        s_axi_rvalid;
logic         s_axi_rready = 1'b1;

assign s_axi_aresetn = ~rst;   // AXI低有效复位

// ==================================================
// Xilinx AXI UartLite IP核实例化（添加安全处理）
// ==================================================
axi_uartlite_0 uart_inst (
    // 系统信号
    .s_axi_aclk(sys_clk),
    .s_axi_aresetn(s_axi_aresetn),
    
    // 写地址通道
    .s_axi_awaddr(s_axi_awaddr),
    .s_axi_awvalid(s_axi_awvalid),
    .s_axi_awready(s_axi_awready),
    
    // 写数据通道
    .s_axi_wdata(s_axi_wdata),
    .s_axi_wstrb(s_axi_wstrb),
    .s_axi_wvalid(s_axi_wvalid),
    .s_axi_wready(s_axi_wready),
    
    // 写响应通道
    .s_axi_bresp(s_axi_bresp),
    .s_axi_bvalid(s_axi_bvalid),
    .s_axi_bready(s_axi_bready),

    // 读通道处理（固定禁用）
    .s_axi_araddr(s_axi_araddr),
    .s_axi_arvalid(s_axi_arvalid),
    .s_axi_arready(s_axi_arready),
    .s_axi_rdata(s_axi_rdata),
    .s_axi_rresp(s_axi_rresp),
    .s_axi_rvalid(s_axi_rvalid),
    .s_axi_rready(s_axi_rready),
    
    // 物理接口安全处理
    .rx(1'b1),          // 未使用的RX接固定高电平
    .tx(uart_tx)
);

// ==================================================
// 发送控制逻辑（增强型状态机）
// ==================================================
logic [4:0] char_cnt;         // 字符计数器（0-31）
logic send_str_active;
logic tx_en_rise;             // 增强型边沿检测

// 改进的边沿检测逻辑
(* ASYNC_REG = "TRUE" *) logic [2:0] tx_en_sync;
always_ff @(posedge sys_clk) begin
    tx_en_sync <= {tx_en_sync[1:0], uart_tx_en};
end
assign tx_en_rise = (tx_en_sync[2:1] == 2'b01);

// 状态机类型定义
typedef enum logic [2:0] {
    TX_IDLE, TX_PREPARE, TX_HANDSHAKE, 
    TX_WAIT_RESP, TX_NEXT_CHAR
} uart_state_t;

uart_state_t uart_state;

// 忙信号生成
always_comb uart_tx_busy = send_str_active;

// 主状态机（增强安全处理）
always_ff @(posedge sys_clk or negedge s_axi_aresetn) begin
    if (!s_axi_aresetn) begin
        uart_state <= TX_IDLE;
        char_cnt <= '0;
        send_str_active <= 1'b0;
        // 复位所有AXI控制信号
        {s_axi_awvalid, s_axi_wvalid} <= 2'b00;
        s_axi_bready <= 1'b0;
        s_axi_awaddr <= 4'h0;
        s_axi_wdata <= 32'h0;
        s_axi_wstrb <= 4'h0;
    end else begin
        case (uart_state)
            TX_IDLE: begin
                if (tx_en_rise && !send_str_active) begin
                    send_str_active <= 1'b1;
                    char_cnt <= '0;
                    uart_state <= TX_PREPARE;
                end
            end
            
            TX_PREPARE: begin
                // 双重终止条件检测
                if (char_cnt < 32 && uart_tx_data[char_cnt] != 8'hFF) begin
                    s_axi_awaddr <= 4'h04;    // Tx FIFO地址
                    s_axi_wdata <= {24'h0, uart_tx_data[char_cnt]};
                    s_axi_wstrb <= 4'b0001;
                    s_axi_awvalid <= 1'b1;
                    s_axi_wvalid <= 1'b1;
                    uart_state <= TX_HANDSHAKE;
                end else begin
                    send_str_active <= 1'b0;
                    uart_state <= TX_IDLE;
                end
            end
            
            TX_HANDSHAKE: begin
                if (s_axi_awready && s_axi_wready) begin
                    s_axi_awvalid <= 1'b0;
                    s_axi_wvalid <= 1'b0;
                    s_axi_bready <= 1'b1;
                    uart_state <= TX_WAIT_RESP;
                end
            end
            
            TX_WAIT_RESP: begin
                if (s_axi_bvalid) begin
                    s_axi_bready <= 1'b0;
                    // 添加错误检测
                    if (s_axi_bresp != 2'b00) begin
                        send_str_active <= 1'b0;
                        uart_state <= TX_IDLE;
                    end else begin
                        uart_state <= TX_NEXT_CHAR;
                    end
                end
            end
            
            TX_NEXT_CHAR: begin
                // 安全递增计数器
                char_cnt <= (char_cnt < 31) ? char_cnt + 1 : 5'h1F;
                uart_state <= TX_PREPARE;
            end
            
            default: uart_state <= TX_IDLE;
        endcase
    end
end

// 接收接口固定处理
assign uart_rx_done = 1'b0;
assign uart_rx_data = 8'h00;

endmodule